first(條件式)
可以定義條件式,來決定拿取資料的條件,但只能拿一個;如果我希望能持續取得資料,當條件不符時才中斷呢?takeWhile
就是你的最佳幫手。takeWhile
會持續地抓取資料,當條件不成立時,會在下一次時才結束。☕take(predict, inclusive)
:predict
:一個函示,提供我們建立條件預測的函示,符合條件回傳true
,條件不成立回傳false
。inclusive
:預設值是false
,字面上來說是包含的意思,也就是當條件不符時回傳false
還是回給我資料吧!import { from, takeWhile } from 'rxjs';
const predict = (val) => val < 3; //<-- 小於3才取值
// case1: takeWhile(predict)
console.log("=== case1: takeWhile(predict) ===")
from([1, 2, 3, 4, 5])
.pipe(takeWhile(predict))
.subscribe({
next: console.log,
complete: () => console.log('completed!'),
});
// 印出結果
// 1
// 2
// completed (當predict回覆為false時結束)
predict
接收到值1,2
時,回覆true
,進行取值。predict
接收到值3
時,回覆false
,呼叫complete
結束。inclusive
設定為true
時,就會回傳最後一個值,趕緊來看一下範例。...
const isInclusive = true;
// case2: set inclusive as true
console.log('=== case2: set inclusive as true ===');
from([1, 2, 3, 4, 5])
.pipe(takeWhile(predict, isInclusive))
.subscribe({
next: console.log,
complete: () => console.log('completed!'),
});
// 印出結果
// 1
// 2
// 3 <--最後一筆資料有印出
// completed (當predict回覆為false時結束)
<3
:不包含3<=3
: 包含3我們在day16:安插個觀察點 - tap (下集)有提到一個有趣的地方,就是使用filter
時,不會終止內部的資料傳遞;今個兒,咱們來看看takeWhile
是不是也有一樣的情形。
我們分別用takeWhile
及filter
,並在放置tap於pipe中
,觀察看看內部資料傳遞的情形。
stackblitz
import { from, takeWhile, filter, tap } from 'rxjs';
const predict = (val) => val < 3; //<-- 小於3才取值
// case3: compare takeWhile + filter
console.log('=== takeWhile case ===');
from([1, 2, 3, 4, 5])
.pipe(
tap((v) => console.log('checked:', v)),
takeWhile(predict)
)
.subscribe({
next: console.log,
complete: () => console.log('completed!'),
});
console.log('=== filter case ===');
from([1, 2, 3, 4, 5])
.pipe(
tap((v) => console.log('checked:', v)),
filter(predict)
)
.subscribe({
next: console.log,
complete: () => console.log('completed!'),
});
takeWhile(predict, inclusive)
:
predict
:一個函示,提供我們建立條件預測的函示,符合條件回傳true
,條件不成立回傳false
。inclusive
:預設值是false
,字面上來說是包含的意思,也就是當條件不符時回傳false
,還是回傳資料。
filter
相比,當不符合條件時:
takeWhile
: 直接中斷內部資料傳遞。filter
: 不會中斷內部資料傳遞,若使用interval
當作observable
,會發生無窮迴圈的現象,這點請特別留意。